package com.linkgie.galaxyframework.metric;

public interface MetricsRegistry {

    public static final long DEFAULT_COLLECTING_INTERVAL = 5;

    /**
     * 领域；
     * 
     * @return
     */
    MetricDomain getDomain();

    /**
     * 注册基于内存的指标计数器；
     * 
     * @param code 指标编码；
     * @param name 指标名称；
     */
    default MetricCounter registerCounter(String code, String name) {
        return registerCounter(code, name, CounterLifetime.MEMORY, null, null);
    }

    /**
     * 注册基于内存的指标计数器；
     * 
     * @param code 指标编码；
     * @param name 指标名称；
     */
    default MetricCounter registerCounter(String code, String name, CounterLifetime lifetime) {
        return registerCounter(code, name, lifetime, null, null);
    }

    /**
     * 注册基于内存的指标计数器；
     * 
     * @param code      指标编码；
     * @param name      指标名称；
     * @param isolation 隔离级别；
     */
    default MetricCounter registerCounter(String code, String name, ValueObjectConverter<?> valueObjectConverter) {
        return registerCounter(code, name, CounterLifetime.MEMORY, null, valueObjectConverter);
    }

    /**
     * 注册基于内存的指标计数器；
     * 
     * @param code                 指标编码；
     * @param name                 指标名称；
     * @param lifetime             计数器生存期；
     * @param valueObjectConverter 值对象转换器；
     * @return
     */
    default MetricCounter registerCounter(String code, String name, CounterLifetime lifetime,
            ValueObjectConverter<?> valueObjectConverter) {
        return registerCounter(code, name, lifetime, null, valueObjectConverter);
    }

    /**
     * 注册基于内存的指标计数器；
     * 
     * @param code      指标编码；
     * @param name      指标名称；
     * @param isolation 隔离级别；
     */
    default MetricCounter registerCounter(String code, String name, MetricIsolation isolation) {
        return registerCounter(code, name, CounterLifetime.MEMORY, isolation, null);
    }

    /**
     * 注册基于内存的指标计数器；
     * 
     * @param code      指标编码；
     * @param name      指标名称；
     * @param lifetime  计数器生存期；
     * @param isolation 隔离上下文提供者；如果为空，则不会做隔离区分；
     * @return
     */
    default MetricCounter registerCounter(String code, String name, CounterLifetime lifetime,
            MetricIsolation isolation) {
        return registerCounter(code, name, lifetime, isolation, null);
    }

    /**
     * 注册基于内存的指标计数器；
     * 
     * @param code                 指标编码；
     * @param name                 指标名称；
     * @param lifetime             计数器生存期；
     * @param isolation            隔离上下文提供者；如果为空，则不会做隔离区分；
     * @param valueObjectConverter 值对象转换器；
     * @return
     */
    MetricCounter registerCounter(String code, String name, CounterLifetime lifetime, MetricIsolation isolation,
            ValueObjectConverter<?> valueObjectConverter);

    /**
     * 注册指标收集器；
     * 
     * <p>
     * 生命期：服务级；
     * 隔离级别：全局（不隔离）；
     * 
     * @param code           指标编码；
     * @param name           指标名称；
     * @param interval       指标收集间隔； 单位为秒；最小值为 1 ；参数小于 1 时，按 1 执行；
     * @param metricSupplier 指标数值收集接口；
     * @return
     */
    default MetricCollector registerCollector(String code, String name, long interval, MetricSupplier metricSupplier) {
        return registerCollector(code, name, interval,
                metricSupplier, null, null);
    }

    /**
     * 注册基于内存的指标收集器；
     * 
     * @param code           指标编码；
     * @param name           指标名称；
     * @param interval       指标收集间隔； 单位为秒；最小值为 1 ；参数小于 1 时，按 1 执行；
     * @param metricSupplier 指标数值收集接口；
     * @return
     */
    default MetricCollector registerCollector(String code, String name, long interval,
            MetricSupplier metricSupplier,
            ValueObjectConverter<?> valueObjectConverter) {
        return registerCollector(code, name, interval, metricSupplier, null, valueObjectConverter);
    }

    /**
     * 注册基于内存的指标收集器；
     * 
     * @param code           指标编码；
     * @param name           指标名称；
     * @param isolation      隔离级别；
     * @param interval       指标收集间隔； 单位为秒；最小值为 1 ；参数小于 1 时，按 1 执行；
     * @param metricSupplier 指标数值收集接口；
     * @return
     */
    default MetricCollector registerCollector(String code, String name, long interval,
            MetricSupplier metricSupplier, MetricIsolation isolation) {
        return registerCollector(code, name, interval, metricSupplier, isolation, null);
    }

    /**
     * 注册基于内存的指标收集器；
     * 
     * @param code                 指标编码；
     * @param name                 指标名称；
     * @param lifeCycle            生命期；
     * @param isolation            隔离级别；
     * @param interval             指标收集间隔； 单位为秒；最小值为 1 ；参数小于 1 时，按 1 执行；
     * @param metricSupplier       指标数值收集接口；
     * @param valueObjectConverter 值对象转换接口；
     * @return
     */
    MetricCollector registerCollector(String code, String name,
            long interval, MetricSupplier metricSupplier, MetricIsolation isolation,
            ValueObjectConverter<?> valueObjectConverter);

}
